package cn.zjnu.aop;

import cn.zjnu.dao.ShoppingDao;
import cn.zjnu.domain.Cart;
import cn.zjnu.domain.Goods;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;

@Component
@Aspect                    //告知Spring这是 AOP 文件
@EnableAspectJAutoProxy    //告知spring这是由 注解 开发的AOP
public class ShoppingAdvice {
    @Autowired
    private ShoppingDao shoppingDao;
    /*
        提取出在购物车页面中修改商品数量的方法中共有的部分：
            1.通过user_id和goods_id锁定购物车中的某一个产品，并将该产品的信息记录下来
            2.将修改后的类作为参数重新传递到原方法中
         将以上代码统一写到该切入点中
     */
    @Pointcut("execution(* cn.zjnu.service.impl.ShoppingServiceImpl.*Goods(..))")
    private void Aop_Goods_QuantityOperation(){}
    @Around("Aop_Goods_QuantityOperation()")
    public Object aroungAop_PlusGoods(ProceedingJoinPoint pjp) throws Throwable{
        Object[] args = pjp.getArgs();
        Cart cart = (Cart) args[0];
        Cart userCart = shoppingDao.getCartById(cart);
        if(userCart == null){//如果商品不存在于购物车中，说明是添加到购物车的操作，此时的数据需要从goods_msg表中读取
            Goods userGood = shoppingDao.getGoodsById(cart.getGoods_id());
            System.out.println("ShoppingAdvice get good :" + userGood);
            cart.setSp_name(userGood.getSp_name());
            cart.setSp_price(userGood.getSp_price());
            cart.setSp_amount(0);
            cart.setSp_msg(userGood.getSp_msg());
            cart.setTotal_price(userGood.getSp_price());
        }else{ //否则属于数量的修改操作，统一将原数据从shopping_cart表中读取
            cart.setSp_name(userCart.getSp_name());
            cart.setSp_price(userCart.getSp_price());
            cart.setSp_amount(userCart.getSp_amount());
            cart.setSp_msg(userCart.getSp_msg());
            cart.setTotal_price(userCart.getTotal_price());
        }
        args[0] = cart;
        Object ret = pjp.proceed(args);
        return ret;
    }

}
